package usbcali.edu.presentation.backEndBeans;

import com.icesoft.faces.async.render.RenderManager;
import com.icesoft.faces.async.render.Renderable;
import com.icesoft.faces.component.ext.HtmlCommandButton;
import com.icesoft.faces.component.ext.HtmlInputText;
import com.icesoft.faces.component.selectinputdate.SelectInputDate;
import com.icesoft.faces.context.DisposableBean;
import com.icesoft.faces.webapp.xmlhttp.FatalRenderingException;
import com.icesoft.faces.webapp.xmlhttp.PersistentFacesState;
import com.icesoft.faces.webapp.xmlhttp.RenderingException;
import com.icesoft.faces.webapp.xmlhttp.TransientRenderingException;

import usbcali.edu.exceptions.*;

import usbcali.edu.persistencia.*;
import usbcali.edu.persistencia.dto.SolAlixfuncionariosDTO;

import usbcali.edu.presentation.businessDelegate.BusinessDelegatorView;

import usbcali.edu.utilities.*;

import java.math.BigDecimal;

import java.util.ArrayList;
import java.util.Date;
import java.util.List;
import java.util.Set;
import java.util.TimeZone;
import java.util.Vector;

import javax.faces.event.ValueChangeEvent;
import javax.faces.model.DataModel;


/**
*
*
* @author Zathura Code Generator http://code.google.com/p/zathura
*
*/
public class SolAlixfuncionariosView extends DataSource implements Renderable,
    DisposableBean {
    private HtmlInputText txtCantidad;
    private HtmlInputText txtDuracion;
    private HtmlInputText txtLabor;
    private HtmlInputText txtLugartrabajo;
    private HtmlInputText txtCedula_Funcionarios;
    private HtmlInputText txtCodResta_Restaurantes;
    private HtmlInputText txtCodSolicituda_SoltAlimentos;
    private HtmlInputText txtCodTtrabajo_TipoTrabajo;
    private HtmlInputText txtConsecutivo;
    private SelectInputDate txtFechaUso;
    private HtmlCommandButton btnSave;
    private HtmlCommandButton btnModify;
    private HtmlCommandButton btnDelete;
    private HtmlCommandButton btnClear;
    private boolean renderDataTable;
    private boolean flag = true;
    private RenderManager renderManager;
    private PersistentFacesState state = PersistentFacesState.getInstance();
    private List<SolAlixfuncionarios> solAlixfuncionarios;
    private List<SolAlixfuncionariosDTO> solAlixfuncionariosDTO;

    public SolAlixfuncionariosView() {
        super("");
    }

    public String action_clear() {
        txtCantidad.setValue(null);
        txtCantidad.setDisabled(true);
        txtDuracion.setValue(null);
        txtDuracion.setDisabled(true);
        txtLabor.setValue(null);
        txtLabor.setDisabled(true);
        txtLugartrabajo.setValue(null);
        txtLugartrabajo.setDisabled(true);
        txtCedula_Funcionarios.setValue(null);
        txtCedula_Funcionarios.setDisabled(true);
        txtCodResta_Restaurantes.setValue(null);
        txtCodResta_Restaurantes.setDisabled(true);
        txtCodSolicituda_SoltAlimentos.setValue(null);
        txtCodSolicituda_SoltAlimentos.setDisabled(true);
        txtCodTtrabajo_TipoTrabajo.setValue(null);
        txtCodTtrabajo_TipoTrabajo.setDisabled(true);
        txtFechaUso.setValue(null);
        txtFechaUso.setDisabled(true);
        txtConsecutivo.setValue(null);
        txtConsecutivo.setDisabled(false);
        btnSave.setDisabled(true);
        btnDelete.setDisabled(true);
        btnModify.setDisabled(true);
        btnClear.setDisabled(false);

        return "";
    }

    public void listener_txtId(ValueChangeEvent event) {
        if ((event.getNewValue() != null) && !event.getNewValue().equals("")) {
            SolAlixfuncionarios entity = null;

            try {
                String consecutivo = new String(txtConsecutivo.getValue()
                                                              .toString());
                entity = BusinessDelegatorView.getSolAlixfuncionarios(consecutivo);
            } catch (Exception e) {
                // TODO: handle exception
            }

            if (entity == null) {
                txtCantidad.setDisabled(false);
                txtDuracion.setDisabled(false);
                txtLabor.setDisabled(false);
                txtLugartrabajo.setDisabled(false);
                txtCedula_Funcionarios.setDisabled(false);
                txtCodResta_Restaurantes.setDisabled(false);
                txtCodSolicituda_SoltAlimentos.setDisabled(false);
                txtCodTtrabajo_TipoTrabajo.setDisabled(false);
                txtFechaUso.setDisabled(false);
                txtConsecutivo.setDisabled(false);
                btnSave.setDisabled(false);
                btnDelete.setDisabled(true);
                btnModify.setDisabled(true);
                btnClear.setDisabled(false);
            } else {
                txtCantidad.setValue(entity.getCantidad());
                txtCantidad.setDisabled(false);
                txtDuracion.setValue(entity.getDuracion());
                txtDuracion.setDisabled(false);
                txtFechaUso.setValue(entity.getFechaUso());
                txtFechaUso.setDisabled(false);
                txtLabor.setValue(entity.getLabor());
                txtLabor.setDisabled(false);
                txtLugartrabajo.setValue(entity.getLugartrabajo());
                txtLugartrabajo.setDisabled(false);
                txtCedula_Funcionarios.setValue(entity.getFuncionarios()
                                                      .getCedula());
                txtCedula_Funcionarios.setDisabled(false);
                txtCodResta_Restaurantes.setValue(entity.getRestaurantes()
                                                        .getCodResta());
                txtCodResta_Restaurantes.setDisabled(false);
                txtCodSolicituda_SoltAlimentos.setValue(entity.getSoltAlimentos()
                                                              .getCodSolicituda());
                txtCodSolicituda_SoltAlimentos.setDisabled(false);
                txtCodTtrabajo_TipoTrabajo.setValue(entity.getTipoTrabajo()
                                                          .getCodTtrabajo());
                txtCodTtrabajo_TipoTrabajo.setDisabled(false);
                txtConsecutivo.setValue(entity.getConsecutivo());
                txtConsecutivo.setDisabled(true);
                btnSave.setDisabled(true);
                btnDelete.setDisabled(false);
                btnModify.setDisabled(false);
                btnClear.setDisabled(false);
            }
        }
    }

    public String action_save() {
        try {
            BusinessDelegatorView.saveSolAlixfuncionarios(FacesUtils.checkLong(
                    txtCantidad), FacesUtils.checkString(txtConsecutivo),
                FacesUtils.checkString(txtDuracion),
                FacesUtils.checkDate(txtFechaUso),
                FacesUtils.checkString(txtLabor),
                FacesUtils.checkString(txtLugartrabajo),
                FacesUtils.checkLong(txtCedula_Funcionarios),
                FacesUtils.checkString(txtCodResta_Restaurantes),
                FacesUtils.checkString(txtCodSolicituda_SoltAlimentos),
                FacesUtils.checkString(txtCodTtrabajo_TipoTrabajo));
            FacesUtils.addInfoMessage(ZMessManager.ENTITY_SUCCESFULLYSAVED);
            action_clear();
        } catch (Exception e) {
            FacesUtils.addErrorMessage(e.getMessage());
        }

        return "";
    }

    public String action_delete() {
        try {
            BusinessDelegatorView.deleteSolAlixfuncionarios(FacesUtils.checkString(
                    txtConsecutivo));
            FacesUtils.addInfoMessage(ZMessManager.ENTITY_SUCCESFULLYDELETED);
            action_clear();
        } catch (Exception e) {
            FacesUtils.addErrorMessage(e.getMessage());
        }

        return "";
    }

    public String action_modify() {
        try {
            BusinessDelegatorView.updateSolAlixfuncionarios(FacesUtils.checkLong(
                    txtCantidad), FacesUtils.checkString(txtConsecutivo),
                FacesUtils.checkString(txtDuracion),
                FacesUtils.checkDate(txtFechaUso),
                FacesUtils.checkString(txtLabor),
                FacesUtils.checkString(txtLugartrabajo),
                FacesUtils.checkLong(txtCedula_Funcionarios),
                FacesUtils.checkString(txtCodResta_Restaurantes),
                FacesUtils.checkString(txtCodSolicituda_SoltAlimentos),
                FacesUtils.checkString(txtCodTtrabajo_TipoTrabajo));
            FacesUtils.addInfoMessage(ZMessManager.ENTITY_SUCCESFULLYMODIFIED);
            action_clear();
        } catch (Exception e) {
            FacesUtils.addErrorMessage(e.getMessage());
        }

        return "";
    }

    public String action_modifyWitDTO(Long cantidad, String consecutivo,
        String duracion, Date fechaUso, String labor, String lugartrabajo,
        Long cedula_Funcionarios, String codResta_Restaurantes,
        String codSolicituda_SoltAlimentos, String codTtrabajo_TipoTrabajo)
        throws Exception {
        try {
            BusinessDelegatorView.updateSolAlixfuncionarios(cantidad,
                consecutivo, duracion, fechaUso, labor, lugartrabajo,
                cedula_Funcionarios, codResta_Restaurantes,
                codSolicituda_SoltAlimentos, codTtrabajo_TipoTrabajo);
            renderManager.getOnDemandRenderer("SolAlixfuncionariosView")
                         .requestRender();
            FacesUtils.addInfoMessage(ZMessManager.ENTITY_SUCCESFULLYMODIFIED);
        } catch (Exception e) {
            //renderManager.getOnDemandRenderer("SolAlixfuncionariosView").requestRender();
            FacesUtils.addErrorMessage(e.getMessage());
            throw e;
        }

        return "";
    }

    public List<SolAlixfuncionarios> getSolAlixfuncionarios() {
        if (flag) {
            try {
                solAlixfuncionarios = BusinessDelegatorView.getSolAlixfuncionarios();
                flag = false;
            } catch (Exception e) {
                flag = true;
                FacesUtils.addErrorMessage(e.getMessage());
            }
        }

        return solAlixfuncionarios;
    }

    public boolean isFlag() {
        return flag;
    }

    public void setSolAlixfuncionarios(
        List<SolAlixfuncionarios> solAlixfuncionarios) {
        this.solAlixfuncionarios = solAlixfuncionarios;
    }

    public boolean isRenderDataTable() {
        try {
            if (flag) {
                if (BusinessDelegatorView.findTotalNumberSolAlixfuncionarios() > 0) {
                    renderDataTable = true;
                } else {
                    renderDataTable = false;
                }
            }

            flag = false;
        } catch (Exception e) {
            renderDataTable = false;
            e.printStackTrace();
        }

        return renderDataTable;
    }

    public DataModel getData() {
        state = PersistentFacesState.getInstance();

        if (onePageDataModel == null) {
            onePageDataModel = new LocalDataModel(pageSize);
        }

        return onePageDataModel;
    }

    /**
    * This is where the Object data is retrieved from the database and
    * returned as a list of objects for display in the UI.
    */
    private DataPage<SolAlixfuncionarios> getDataPage(int startRow, int pageSize) {
        // Retrieve the total number of objects from the database.  This
        // number is required by the DataPage object so the paginator will know
        // the relative location of the page data.
        int totalNumberSolAlixfuncionarios = 0;

        try {
            totalNumberSolAlixfuncionarios = BusinessDelegatorView.findTotalNumberSolAlixfuncionarios()
                                                                  .intValue();
        } catch (Exception e) {
            FacesUtils.addErrorMessage(e.getMessage());
        }

        // Calculate indices to be displayed in the ui.
        int endIndex = startRow + pageSize;

        if (endIndex > totalNumberSolAlixfuncionarios) {
            endIndex = totalNumberSolAlixfuncionarios;
        }

        try {
            solAlixfuncionarios = BusinessDelegatorView.findPageSolAlixfuncionarios(sortColumnName,
                    sortAscending, startRow, endIndex - startRow);

            // Remove this Renderable from the existing render groups.
            //leaveRenderGroups();        			
        } catch (Exception e) {
            FacesUtils.addErrorMessage(e.getMessage());
        }

        // Add this Renderable to the new render groups.
        //joinRenderGroups();
        // Reset the dirtyData flag.
        onePageDataModel.setDirtyData(false);
        // This is required when using Hibernate.  If the SessionManager is not
        // cleared or closed objects are cached and stale objects will show up
        // in the table.
        // This way, the detached objects are reread from the database.
        // This call is not required with Hibernate, which uses a Query Hint
        // to clear the l2 cache in the DAO.
        flag = true;

        return new DataPage<SolAlixfuncionarios>(totalNumberSolAlixfuncionarios,
            startRow, solAlixfuncionarios);
    }

    public DataModel getDataDTO() {
        state = PersistentFacesState.getInstance();

        if (onePageDataModel == null) {
            onePageDataModel = new LocalDataModelDTO(pageSize);
        }

        return onePageDataModel;
    }

    /**
    * This is where the Object data is retrieved from the database and
    * returned as a list of objects for display in the UI.
    */
    private DataPage<SolAlixfuncionariosDTO> getDataPageDTO(int startRow,
        int pageSize) {
        // Retrieve the total number of objects from the database.  This
        // number is required by the DataPage object so the paginator will know
        // the relative location of the page data.
        int totalNumberSolAlixfuncionarios = 0;

        try {
            totalNumberSolAlixfuncionarios = BusinessDelegatorView.findTotalNumberSolAlixfuncionarios()
                                                                  .intValue();
        } catch (Exception e) {
            FacesUtils.addErrorMessage(e.getMessage());
        }

        // Calculate indices to be displayed in the ui.
        int endIndex = startRow + pageSize;

        if (endIndex > totalNumberSolAlixfuncionarios) {
            endIndex = totalNumberSolAlixfuncionarios;
        }

        try {
            solAlixfuncionarios = BusinessDelegatorView.findPageSolAlixfuncionarios(sortColumnName,
                    sortAscending, startRow, endIndex - startRow);

            if (Utilities.validationsList(solAlixfuncionarios)) {
                solAlixfuncionariosDTO = new ArrayList<SolAlixfuncionariosDTO>();

                for (SolAlixfuncionarios solAlixfuncionariosTmp : solAlixfuncionarios) {
                    SolAlixfuncionariosDTO solAlixfuncionariosDTO2 = new SolAlixfuncionariosDTO();
                    solAlixfuncionariosDTO2.setConsecutivo(solAlixfuncionariosTmp.getConsecutivo()
                                                                                 .toString());
                    solAlixfuncionariosDTO2.setCantidad((solAlixfuncionariosTmp.getCantidad() != null)
                        ? solAlixfuncionariosTmp.getCantidad().toString() : null);
                    solAlixfuncionariosDTO2.setDuracion((solAlixfuncionariosTmp.getDuracion() != null)
                        ? solAlixfuncionariosTmp.getDuracion().toString() : null);
                    solAlixfuncionariosDTO2.setFechaUso(solAlixfuncionariosTmp.getFechaUso());
                    solAlixfuncionariosDTO2.setLabor((solAlixfuncionariosTmp.getLabor() != null)
                        ? solAlixfuncionariosTmp.getLabor().toString() : null);
                    solAlixfuncionariosDTO2.setLugartrabajo((solAlixfuncionariosTmp.getLugartrabajo() != null)
                        ? solAlixfuncionariosTmp.getLugartrabajo().toString()
                        : null);
                    solAlixfuncionariosDTO2.setCedula_Funcionarios((solAlixfuncionariosTmp.getFuncionarios()
                                                                                          .getCedula() != null)
                        ? solAlixfuncionariosTmp.getFuncionarios().getCedula()
                                                .toString() : null);
                    solAlixfuncionariosDTO2.setCodResta_Restaurantes((solAlixfuncionariosTmp.getRestaurantes()
                                                                                            .getCodResta() != null)
                        ? solAlixfuncionariosTmp.getRestaurantes().getCodResta()
                                                .toString() : null);
                    solAlixfuncionariosDTO2.setCodSolicituda_SoltAlimentos((solAlixfuncionariosTmp.getSoltAlimentos()
                                                                                                  .getCodSolicituda() != null)
                        ? solAlixfuncionariosTmp.getSoltAlimentos()
                                                .getCodSolicituda().toString()
                        : null);
                    solAlixfuncionariosDTO2.setCodTtrabajo_TipoTrabajo((solAlixfuncionariosTmp.getTipoTrabajo()
                                                                                              .getCodTtrabajo() != null)
                        ? solAlixfuncionariosTmp.getTipoTrabajo()
                                                .getCodTtrabajo().toString()
                        : null);
                    solAlixfuncionariosDTO2.setSolAlixfuncionarios(solAlixfuncionariosTmp);
                    solAlixfuncionariosDTO2.setSolAlixfuncionariosView(this);
                    solAlixfuncionariosDTO.add(solAlixfuncionariosDTO2);
                }
            }

            // Remove this Renderable from the existing render groups.
            leaveRenderGroups();
        } catch (Exception e) {
            FacesUtils.addErrorMessage(e.getMessage());
        }

        // Add this Renderable to the new render groups.
        joinRenderGroups();
        // Reset the dirtyData flag.
        onePageDataModel.setDirtyData(false);
        // This is required when using Hibernate.  If the SessionManager is not
        // cleared or closed objects are cached and stale objects will show up
        // in the table.
        // This way, the detached objects are reread from the database.
        // This call is not required with Hibernate, which uses a Query Hint
        // to clear the l2 cache in the DAO.
        flag = true;

        return new DataPage<SolAlixfuncionariosDTO>(totalNumberSolAlixfuncionarios,
            startRow, solAlixfuncionariosDTO);
    }

    protected boolean isDefaultAscending(String sortColumn) {
        return true;
    }

    /**
    * This method is called when a render call is made from the server. Render
    * calls are only made to views containing an updated record. The data is
    * marked as dirty to trigger a fetch of the updated record from the
    * database before rendering takes place.
    */
    public PersistentFacesState getState() {
        onePageDataModel.setDirtyData();

        return state;
    }

    /**
    * This method is called from faces-config.xml with each new session.
    */
    public void setRenderManager(RenderManager renderManager) {
        this.renderManager = renderManager;
    }

    public void renderingException(RenderingException arg0) {
        if (arg0 instanceof TransientRenderingException) {
        } else if (arg0 instanceof FatalRenderingException) {
            // Remove from existing Customer render groups.
            leaveRenderGroups();
        }
    }

    /**
    * Remove this Renderable from existing uiCustomerBeans render groups.
    * OnDemandRenderers are named/created using the underlying Customer Number.
    */
    private void leaveRenderGroups() {
        if (Utilities.validationsList(solAlixfuncionariosDTO)) {
            for (SolAlixfuncionariosDTO solAlixfuncionariosTmp : solAlixfuncionariosDTO) {
                renderManager.getOnDemandRenderer("SolAlixfuncionariosView")
                             .remove(this);
            }
        }
    }

    /**
    * Add this Renderable to the new uiCustomerBeans render groups.
    * OnDemandRenderers are named/created using the underlying Customer Number.
    */
    private void joinRenderGroups() {
        if (Utilities.validationsList(solAlixfuncionariosDTO)) {
            for (SolAlixfuncionariosDTO solAlixfuncionariosTmp : solAlixfuncionariosDTO) {
                renderManager.getOnDemandRenderer("SolAlixfuncionariosView")
                             .add(this);
            }
        }
    }

    public void dispose() throws Exception {
    }

    public RenderManager getRenderManager() {
        return renderManager;
    }

    public void setState(PersistentFacesState state) {
        this.state = state;
    }

    public HtmlInputText getTxtCantidad() {
        return txtCantidad;
    }

    public void setTxtCantidad(HtmlInputText txtCantidad) {
        this.txtCantidad = txtCantidad;
    }

    public HtmlInputText getTxtDuracion() {
        return txtDuracion;
    }

    public void setTxtDuracion(HtmlInputText txtDuracion) {
        this.txtDuracion = txtDuracion;
    }

    public HtmlInputText getTxtLabor() {
        return txtLabor;
    }

    public void setTxtLabor(HtmlInputText txtLabor) {
        this.txtLabor = txtLabor;
    }

    public HtmlInputText getTxtLugartrabajo() {
        return txtLugartrabajo;
    }

    public void setTxtLugartrabajo(HtmlInputText txtLugartrabajo) {
        this.txtLugartrabajo = txtLugartrabajo;
    }

    public HtmlInputText getTxtCedula_Funcionarios() {
        return txtCedula_Funcionarios;
    }

    public void setTxtCedula_Funcionarios(HtmlInputText txtCedula_Funcionarios) {
        this.txtCedula_Funcionarios = txtCedula_Funcionarios;
    }

    public HtmlInputText getTxtCodResta_Restaurantes() {
        return txtCodResta_Restaurantes;
    }

    public void setTxtCodResta_Restaurantes(
        HtmlInputText txtCodResta_Restaurantes) {
        this.txtCodResta_Restaurantes = txtCodResta_Restaurantes;
    }

    public HtmlInputText getTxtCodSolicituda_SoltAlimentos() {
        return txtCodSolicituda_SoltAlimentos;
    }

    public void setTxtCodSolicituda_SoltAlimentos(
        HtmlInputText txtCodSolicituda_SoltAlimentos) {
        this.txtCodSolicituda_SoltAlimentos = txtCodSolicituda_SoltAlimentos;
    }

    public HtmlInputText getTxtCodTtrabajo_TipoTrabajo() {
        return txtCodTtrabajo_TipoTrabajo;
    }

    public void setTxtCodTtrabajo_TipoTrabajo(
        HtmlInputText txtCodTtrabajo_TipoTrabajo) {
        this.txtCodTtrabajo_TipoTrabajo = txtCodTtrabajo_TipoTrabajo;
    }

    public SelectInputDate getTxtFechaUso() {
        return txtFechaUso;
    }

    public void setTxtFechaUso(SelectInputDate txtFechaUso) {
        this.txtFechaUso = txtFechaUso;
    }

    public HtmlInputText getTxtConsecutivo() {
        return txtConsecutivo;
    }

    public void setTxtConsecutivo(HtmlInputText txtConsecutivo) {
        this.txtConsecutivo = txtConsecutivo;
    }

    public HtmlCommandButton getBtnSave() {
        return btnSave;
    }

    public void setBtnSave(HtmlCommandButton btnSave) {
        this.btnSave = btnSave;
    }

    public HtmlCommandButton getBtnModify() {
        return btnModify;
    }

    public void setBtnModify(HtmlCommandButton btnModify) {
        this.btnModify = btnModify;
    }

    public HtmlCommandButton getBtnDelete() {
        return btnDelete;
    }

    public void setBtnDelete(HtmlCommandButton btnDelete) {
        this.btnDelete = btnDelete;
    }

    public HtmlCommandButton getBtnClear() {
        return btnClear;
    }

    public void setBtnClear(HtmlCommandButton btnClear) {
        this.btnClear = btnClear;
    }

    public void setRenderDataTable(boolean renderDataTable) {
        this.renderDataTable = renderDataTable;
    }

    public void setFlag(boolean flag) {
        this.flag = flag;
    }

    public List<SolAlixfuncionariosDTO> getSolAlixfuncionariosDTO() {
        return solAlixfuncionariosDTO;
    }

    public void setSolAlixfuncionariosDTO(
        List<SolAlixfuncionariosDTO> solAlixfuncionariosDTO) {
        this.solAlixfuncionariosDTO = solAlixfuncionariosDTO;
    }

    public TimeZone getTimeZone() {
        return java.util.TimeZone.getDefault();
    }

    /**
    * A special type of JSF DataModel to allow a datatable and datapaginator
    * to page through a large set of data without having to hold the entire
    * set of data in memory at once.
    * Any time a managed bean wants to avoid holding an entire dataset,
    * the managed bean declares this inner class which extends PagedListDataModel
    * and implements the fetchData method. fetchData is called
    * as needed when the table requires data that isn't available in the
    * current data page held by this object.
    * This requires the managed bean (and in general the business
    * method that the managed bean uses) to provide the data wrapped in
    * a DataPage object that provides info on the full size of the dataset.
    */
    private class LocalDataModel extends PagedListDataModel {
        public LocalDataModel(int pageSize) {
            super(pageSize);
        }

        public DataPage<SolAlixfuncionarios> fetchPage(int startRow,
            int pageSize) {
            // call enclosing managed bean method to fetch the data
            return getDataPage(startRow, pageSize);
        }
    }

    private class LocalDataModelDTO extends PagedListDataModel {
        public LocalDataModelDTO(int pageSize) {
            super(pageSize);
        }

        public DataPage<SolAlixfuncionariosDTO> fetchPage(int startRow,
            int pageSize) {
            // call enclosing managed bean method to fetch the data
            return getDataPageDTO(startRow, pageSize);
        }
    }
}
